﻿using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Green.ObjectPickUper;
using System.CodeDom.Compiler;

namespace Green.AgileMapper.Test.ObjectPickUper
{
    /// <summary>
    /// ObjectPickUper 的摘要说明
    /// </summary>
    [TestClass]
    public class ObjectPickUperTest
    {
        public ObjectPickUperTest()
        {
            //
            //TODO: 在此处添加构造函数逻辑
            //
        }

        private TestContext testContextInstance;

        /// <summary>
        ///获取或设置测试上下文，该上下文提供
        ///有关当前测试运行及其功能的信息。
        ///</summary>
        public TestContext TestContext
        {
            get
            {
                return testContextInstance;
            }
            set
            {
                testContextInstance = value;
            }
        }

        #region 附加测试属性
        //
        // 编写测试时，还可使用以下附加属性:
        //
        // 在运行类中的第一个测试之前使用 ClassInitialize 运行代码
        // [ClassInitialize()]
        // public static void MyClassInitialize(TestContext testContext) { }
        //
        // 在类中的所有测试都已运行之后使用 ClassCleanup 运行代码
        // [ClassCleanup()]
        // public static void MyClassCleanup() { }
        //
        // 在运行每个测试之前，使用 TestInitialize 来运行代码
        // [TestInitialize()]
        // public void MyTestInitialize() { }
        //
        // 在每个测试运行完之后，使用 TestCleanup 来运行代码
        // [TestCleanup()]
        // public void MyTestCleanup() { }
        //
        #endregion

        [TestMethod]
        public void ObjectPickUper_GenCode_Test()
        {
            ObjectPickUperManager.Instance.IsSOAObject = false;
            var str = ObjectPickUperManager.Instance.PickUp<StudenDo>("DTO");
            var str1 = ObjectPickUperManager.Instance.PickUp<ContactWay>("DTO");
            var str2 = ObjectPickUperManager.Instance.PickUp<KeyValuePair>("DTO");

            Assert.IsTrue(!string.IsNullOrEmpty(str));

            //验证编译是否正确
            CompilerParameters option = new CompilerParameters();
            option.GenerateExecutable = false;
            option.GenerateInMemory = true;
            option.IncludeDebugInformation = false;
            option.ReferencedAssemblies.Add("System.dll");
            option.ReferencedAssemblies.Add(typeof(System.Linq.IQueryable).Assembly.Location);
            option.ReferencedAssemblies.Add(typeof(StudenDo).Assembly.Location);
            option.ReferencedAssemblies.Add(typeof(Green.AgileMapper.CollectionMappingAttribute).Assembly.Location);

            var result = CodeDomProvider.CreateProvider("c#").CompileAssemblyFromSource(option, str, str1, str2);
            var assembly = result.CompiledAssembly;
            Assert.IsFalse(result.Errors.HasErrors, "编译错误");
        }
    }
}
